#+TITLE: .dotfiles

* Overview

I use of Emacs for almost everything, including my window manager ([[https://github.com/ch11ng/exwm][EXWM]]), except
for the [[https://nyxt.atlas.engineer][Nyxt]] web browser.  See my [[https://ambrevar.xyz/emacs/][Emacs pro-tips]].

As such, the more-or-less advanced configurations of my former favourite Unix
programs are gone (Awesome, cmus, fish, fzf, Mutt, newsbeuter, ranger, urxvt,
zathura, zsh).  You can search for them before the git commit =README: The Big
Emacs Shift=.

* E-mail setup

Emails can be particularly tricky to set up, so I think they deserve a dedicated
section.  My configuration files:

- [[file:.mbsyncrc][.mbsyncrc]] for =mbsync= from the ~isync~ project to synchronize mail mailboxes
  over IMAP.
- [[file:.notmuch-config][.notmuch-config]] for the email indexer.
- A [[.cache/mail/.notmuch/hooks/pre-new][notmuch hook]] to tell Notmuch to use =mbsync= to fetch new emails.
- My Emacs' [[file:.emacs.d/lisp/init-notmuch.el][init-notmuch.el]] for the user interface with the [[https://github.com/emacs-helm/helm-notmuch][helm-notmuch]] extension for
  searches with live updates.  (A must!)
- My Emacs' [[file:.emacs.d/lisp/init-message.el][init-message.el]] to send emails.  I can afford to not rely on a
  dedicated SMTP client (e.g. =msmtp=) since all my email accounts use the same
  SMTP server.
- My Emacs' [[file:.emacs.d/lisp/init-notmuch-sync.el][init-notmuch-sync.el]] and my [[file:.local/bin/homesync][homesync]] script to synchronize the user
  tags (but not the automatic ones) under version control.

* Setup

For the list of programs I currently use, see the =.package-lists/= folder.

The =homeinit= script fully bootstraps a user profile with required files,
folders, symlinks and applications.

The =homeclean= script removes trash files, cache and warns if critically
private data is found (e.g. PGP keys).

The =homesync= script updates the package lists, prints the status of all known
projects and optionally pushes the unmerged changes upstream.

As for managing a dotfiles repository, there are various approaches.

** Direct versioning

Git makes it possible to use your home folder as a git repository, thus
versioning all files directly.

#+BEGIN_SRC sh
$ cd
$ git init
$ git remote add origin <repo>
$ git fetch
$ git checkout master
#+END_SRC

** GNU Stow

[[https://www.gnu.org/software/stow/][GNU Stow]] lets you symlink a project's files to an arbitrary folder.

The simplest setup would be to clone the dotfiles to, say, =~/dotfiles= then run

#+BEGIN_SRC sh
$ cd ~/dotfiles
$ stow .
#+END_SRC

Or, from a different location:
#+begin_src sh
$ cd /path/to/dotfiles
$ stow -t ~ .
#+end_src

This has several advantages over direct versioning:

- Subfolders in home are not subject to being included into the dotfiles git
  repository.  This is especially relevant for projects under a version control
  system other than git.

- No need for a =.gitignore=.

- Simplified file control (add/remove/etc.).

- You can fine-tune which program configuration to synchronize on a per-system
  basis.

- You can manage several configurations for the same programs.

* License

Unless stated otherwise, all files are under the GPL3 license.
See COPYING for the full license.
